李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

SSH 服务器

Table of Contents

1. 启停

SSH 是 C/S 架构的软件。OpenSSH 的客户端软件是 ssh,服务器软件是 sshd。本文介绍 sshd。

如果没有安装 sshd,可以 sudo apt install openssh-server 直接安装。

一般来说,sshd 安装后会跟着系统一起启动。如果没启动 可以直接 sudo systemctl start sshd 启动, sudo systemctl enable sshd 使之可以自启动。

2. sshd 的配置文件

sshd 的配置文件为 /etc/sshsshd_config,同目录下也有一些安装时自动生成的密钥。

注意,如果重装 sshd 时 /etc/ssh 目录下的密钥都会重新生成,导致客户端重新 ssh 连接服务器时,会跳出警告,拒绝连接。可以在重装 sshd 前备份 /etc/ssh 目录,重装后用旧备份覆盖新配置。

配置文件 sshd_config 中:

  1. 每个命令占据一行。
  2. 每行都是配置项和对应的值。
  3. 配置项的大小写不敏感。
  4. 与值之间使用空格分隔。

比如:

# 指定 ssh-server 的监听端口为 2034
# 即 ssh 客户端可以通过服务器的 2034 端口连接到 sshd 进程
Port 2034

# 另一种格式,配置项与值之间有一个等号,等号前后的空格可选
Port = 2034

配置文件中 # 开头的行表示注释。空行等同于注释。 注释只能放在一行的开头,不能放在一行的结尾。

sshd 启动时自动读取 /etc/ssh/sshd_config 配置文件 ( 默认 )。如果希望使用其他的配置文件,可以用 -f 参数 sshd -f </path/to/my_config> 指定。

修改配置文件以后,可以用 sshd -t 检查有没有语法错误。

配置文件修改以后,并不会自动生效,必须重新启动 sshd。

3. sshd 密钥

sshd 有自己的一对或多对密钥。它使用密钥向客户端证明自己的身份。

所有密钥都是公钥和私钥成对出现,公钥的文件名一般是私钥文件名加上后缀 .pub

如果需要支持 SSH 1 协议,则必须有密钥 /etc/ssh/ssh_host_key。

如果密钥不是默认文件,那么可以通过配置文件 sshd_config 的 HostKey 配置项指定。默认密钥的设置如下:

# HostKey for protocol version 1
# HostKey /etc/ssh/ssh_host_key

# HostKeys for protocol version 2
# HostKey /etc/ssh/ssh_host_rsa_key
# HostKey /etc/ssh/ssh_host_dsa_ke

上面命令前面的 # 表示这些行都是注释,因为这是默认值,有没有这几行都一样。

如果要修改密钥,就要去掉行首的 #,指定其他密钥。

HostKey /usr/local/ssh/my_dsa_key
HostKey /usr/local/ssh/my_rsa_key
HostKey /usr/local/ssh/my_old_ssh1_key

4. sshd 配置项

以下是 /etc/ssh/sshd_config 文件里面的常用配置项:

  • AcceptEnv [<env-1> [<env-2> ...]] 允许客户端通过 SendEnv 命令传输来的环境变量列表,变量名之间使用空格分隔。
  • AllowGroups [<group-a> [<group-b> ...]] 允许登录的用户组,多个组之间用空格分隔。为空则允许所有用户组登录。
  • DenyGroups [<group-a> [<group-b> ...]] 不允许登录的用户组。用法同上。
  • AllowUsers [<user-1> [<user-2> ...]] 允许登录的用户,用空格分隔用户名。可使用多行 AllowUsers 来指定多个用户。用户名支持使用通配符。为空则允许所有用户登录。该项也可以使用 <user_name>@<host> 的格式。
  • DenyUsers [<user-1> [<user-2> ...]] 不允许登录的用户。用法同上。
  • AllowTcpForwarding [yes | local | remote] 是否允许端口转发,默认为 yeslocal 表示只允许本地端口转发, remote 表示只允许远程端口转发。
  • AuthorizedKeysFile </path/to/authorized_keys_file> 用户公钥存储路径,默认是 ~/.ssh/authorized_keys 目录。
  • Banner </path/to/text-file> 用户登录后,sshd 向其展示的信息文件。默认为空,即不展示任何内容。
  • ChallengeResponseAuthentication [yes | no] 是否使用键盘交互身份验证方案,默认值为 yes 。理论上讲,键盘交互身份验证方案可以向用户询问多重问题,但是实践中,通常仅询问用户密码。如果要完全禁用基于密码的身份验证,将 PasswordAuthenticationChallengeResponseAuthentication 都设置为 no
  • Ciphers {Ciphers | 3des-cbc | Ciphers,3des-cbc} sshd 可以接受的加密算法 Ciphers3des-cbc ,多个算法之间使用逗号分隔。
  • ClientAliveCountMax <number> 建立连接后,客户端失去响应时,服务器尝试连接的次数。
  • ClientAliveInterval <seconds> 允许客户端发呆的时间,单位为秒。如果这段时间里面,客户端没有发送任何信号,SSH 连接关闭。
  • Compression [yes | no] 客户端与服务器之间的数据传输是否压缩。默认 yes
  • HostKey sshd 服务器的密钥。
  • ListenAddress <ip> sshd 监听的本机 IP 地址,即 sshd 启用的 IP 地址,默认是 ListenAddress 0.0.0.0 表示在本机所有网络接口启用。可以改成只在某个网络接口启用 ( 比如 ListenAddress 192.168.10.23 ),也可以指定某个域名启用 ( 比如 ListenAddress server.example.com )。监听多个的 IP 地址,可以使用多行 ListenAddress 命令。
  • LoginGraceTime <seconds> 允许客户端登录时等待的最长时间,比如用户迟迟不输入密码,连接就会自动断开,单位为秒。值 0 表示没有限制。
  • LogLevel <log-level> 日志的详细程度,可能的值依次为 QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3 。默认为 LogLevel INFO
  • MACs sshd 可以接受的数据校验算法,多个算法之间使用逗号分隔。
  • MaxAuthTries <number> 允许 SSH 登录的最大尝试次数,如果密码输入错误达到指定次数,SSH 连接将关闭。
  • MaxStartups <number> 允许同时并发的 SSH 连接数量,无默认值。值 0 表示没有限制。也可以设为 A:B:C 的形式,比如 MaxStartups 10:50:20 意为如果达到 10 个并发连接,后面的连接将有 50% 的概率被拒绝;如果达到 20 个并发连接,则后面的连接将 100% 被拒绝。
  • PasswordAuthentication [yes | no] 是否允许密码登录,默认为 yes 。建议改成 no 禁止密码登录,只允许密钥登录。
  • PermitEmptyPasswords [yes | no] 是否允许空密码登录,即用户的密码是否可以为空,默认 yes ,建议改成 no 禁止无密码登录。
  • PermitRootLogin [yes | no] 是否允许 root 用户登录,默认为 yes 。建议改成 no 禁止 root 用户登录。还有一种写法是写成 PermitRootLogin prohibit-password 表示 root 用户不能用密码登录,但是可以用密钥登录。
  • PermitUserEnvironment [yes | no] 是否允许 sshd 加载客户端的 ~/.ssh/environment 文件和 ~/.ssh/authorized_keys 文件里面的 environment=<options> 环境变量设置。默认值 no
  • Port <port> sshd 监听的端口,即客户端连接的端口,默认 22 。出于安全考虑,可以改掉这个端口。配置文件可以使用多行 Port 命令来同时监听多个端口。
  • PrintMotd [yes | no] 用户登录后,是否向其展示系统的 motd ( Message of the the day ) 信息文件 etc/motd。该文件用于通知所有用户一些重要事项,比如系统维护时间、安全问题等。默认值 /yes 由于 Shell 一般会展示这个信息文件,所以可改为 *no*。
  • PrintLastLog [yes | no] 是否打印上一次用户登录时间,默认值 yes
  • Protocol {1 | 2 | 1,2} sshd 使用的协议。 Protocol 1 表示使用 SSH v1 协议,建议改成 Protocol 2Protocol 2,1 表示同时支持两个版本的协议。
  • PubKeyAuthentication [yes | no] 是否允许公钥登录,默认值 yes
  • QuietMode [yes | no] SSH v1 版本专用,日志只输出致命的错误信息,默认为 yes
  • KeyRegenerationInterval <seconds> SSH 1 版本的密钥重新生成时间间隔,单位为秒,默认是 3600
  • RSAAuthentication [yes | no] 允许 RSA 认证,默认为 yes
  • ServerKeyBits <number> SSH v1 版本的密钥重新生成时的位数,默认为 768
  • StrictModes [yes | no] sshd 是否检查用户的一些重要文件和目录的权限。默认为 yes 。对于用户的 SSH 配置文件、密钥文件和所在目录,SSH 要求拥有者必须是根用户或用户本人,用户组和其他人的写权限必须关闭。
  • SyslogFacility Syslog 如何处理 sshd 的日志,默认 SyslogFacility AUTH
  • TCPKeepAlive [yes | no] 打开 sshd 跟客户端 TCP 连接的 keepalive 参数,默认为 yes
  • UseDNS [yes | no] 用户 SSH 登录一个域名时,服务器是否使用 DNS,确认该域名对应的 IP 地址包含本机,默认为 yes 。打开该选项意义不大,而且如果 DNS 更新不及时,还有可能误判,建议关闭。
  • UseLogin [yes | no] 用户认证内部是否使用 /usr/bin/login 替代 SSH 工具,默认 no
  • UserPrivilegeSeparation [yes | no] 用户认证通过以后,使用另一个子线程处理用户权限相关的操作,这样有利于提高安全性。默认为 yes
  • VerboseMode [yes | no] SSH v2 版本专用,日志输出详细的 Debug 信息,默认为 yes
  • X11Forwarding [yes | no] 是否打开 X window 的转发,默认为 no

修改配置文件以后,用 sshd -t 验证配置文件是否有语法错误。新配置在重启 sshd 后生效。

5. sshd 的命令行配置项

sshd 命令有一些配置项。这些配置项在调用时指定,可以覆盖配置文件的设置。

  1. -d 显示 debug 信息。
  2. -D sshd 不作为后台守护进程运行。
  3. -e 将 sshd 写入系统日志 syslog 的内容导向标准错误 standard error
  4. -f 指定配置文件的位置。
  5. -h 指定私钥 sshd -h </path/to/private_key>
  6. -o 指定配置文件的一个配置项和对应的值: sshd -o "<key> <value>", sshd -o "<key> = <value>" 或者 sshd -o key=value-o 参数可以一次使用多个来指定多个配置。
  7. -p 指定 sshd 的服务端口。可以指定多个端口: `sshd -p <port-a> [-p <port-b> ...]= 。
  8. -t 检查配置文件的语法是否正确。


Last Update: 2023-05-27 Sat 16:18

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议